typedef float float_complex[2];
typedef double double_complex[2];

#define DECLARE_REDFUNC(func, type) void red_##func##_##type(int items, type *vars, int length, char *locs, int locSize, type *res, char *locRes)
DECLARE_REDFUNC(sum, char);
DECLARE_REDFUNC(mult, char);
DECLARE_REDFUNC(max, char);
DECLARE_REDFUNC(min, char);
DECLARE_REDFUNC(and, char);
DECLARE_REDFUNC(or, char);
DECLARE_REDFUNC(xor, char);
DECLARE_REDFUNC(equ, char);
DECLARE_REDFUNC(ne, char);
DECLARE_REDFUNC(eq, char);

DECLARE_REDFUNC(sum, int);
DECLARE_REDFUNC(mult, int);
DECLARE_REDFUNC(max, int);
DECLARE_REDFUNC(min, int);
DECLARE_REDFUNC(and, int);
DECLARE_REDFUNC(or, int);
DECLARE_REDFUNC(xor, int);
DECLARE_REDFUNC(equ, int);
DECLARE_REDFUNC(ne, int);
DECLARE_REDFUNC(eq, int);

DECLARE_REDFUNC(sum, long);
DECLARE_REDFUNC(mult, long);
DECLARE_REDFUNC(max, long);
DECLARE_REDFUNC(min, long);
DECLARE_REDFUNC(and, long);
DECLARE_REDFUNC(or, long);
DECLARE_REDFUNC(xor, long);
DECLARE_REDFUNC(equ, long);
DECLARE_REDFUNC(ne, long);
DECLARE_REDFUNC(eq, long);

DECLARE_REDFUNC(sum, float);
DECLARE_REDFUNC(mult, float);
DECLARE_REDFUNC(max, float);
DECLARE_REDFUNC(min, float);

DECLARE_REDFUNC(sum, double);
DECLARE_REDFUNC(mult, double);
DECLARE_REDFUNC(max, double);
DECLARE_REDFUNC(min, double);

DECLARE_REDFUNC(sum, float_complex);
DECLARE_REDFUNC(mult, float_complex);

DECLARE_REDFUNC(sum, double_complex);
DECLARE_REDFUNC(mult, double_complex);
